--[[
redis 在 redisTemplate 上下文中，提供了操作 redis db 的方式

ARGV 在 redisTemplate 上下文中，为传递参数的数组

KEYS 在 redisTemplate 上下文中，为传递key的数组，阿里 redis db 不允许KEYS赋值给lua 变量，否则失效
--]]
local result
-- 变动步长 lua中数组索引从1开始
local step=tonumber(ARGV[1])
-- 变动凭据
local ticket=ARGV[2]
-- 过期时间
local expired=tonumber(ARGV[3])
-- check 值是否已存在
local valExist = redis.call("EXISTS",KEYS[1]);
if(valExist<1) then
    return ""
end
-- check 凭据是否已用
local exist = redis.call("HEXISTS",KEYS[2],ticket)
if(exist>0) then
result = redis.call("GET",KEYS[1])
return result
end
-- 消费 凭据
redis.call("HSET",KEYS[2],ticket,step)
redis.call("EXPIRE",KEYS[2],expired)
-- 做递增或递减操作
if(step<0) then
result = redis.call("DECRBY",KEYS[1],-step)
else
result = redis.call("INCRBY",KEYS[1],step)
end
redis.call("EXPIRE",KEYS[1],expired)
-- 返回结果，由于使用 stringRedisTemplate，返回值用string，否则值转换有问题
return tostring(result)